Generator生成器函数
chenpeng 2020-11-30 ES6异步
# 1.概念
ES6 引入了 Generator 函数,可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,为异步编程提供了解决方案
# 2.声明 Generator 函数
function* gen() {}
1
# 3.使用 yield 表达式
yield 是 Generator 函数中暂缓执行的标识,yield 只能在 Generator 函数中使用,在普通函数中使用会报错
function* gen() {
yield 1;
}
1
2
3
2
3
在 Generator 函数中还有 yield* 这个表达式,用于在 Generator 函数内部,调用另一个 Generator 函数
function* foo() {
yield 'a';
yield 'b';
}
function* gen() {
yield* foo();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
上述代码等价于
function* gen() {
for(let value of foo()){
yield value;
}
}
1
2
3
4
5
2
3
4
5
# 4.使用 next 方法
Generator 函数直接调用并不会执行,需要调用 next 方法才会执行
function* gen() {
yield 1;
}
let g = gen();
console.log(g.next()); // {value: 1, done: false}
console.log(g.next()); // {value: undefined, done: true}
1
2
3
4
5
6
2
3
4
5
6
gen 函数返回的是一个 Iterator 对象,利用 next 方法对 Iterator 对象进行遍历
next 方法传参
一般情况下,next 方法不传入参数时,yield 的表达式是一个 undefined 对象;当 next 方法传入参数的时候,该参数会作为上一步 yield 的返回值
function* gen() {
let x = yield 1;
console.log(x);
}
let g = gen();
console.log(g.next());
// {value: 1, done: false}
// 10
g.next(10);
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
除了使用 next 方法,还可以使用 for...of 遍历 Generator 函数生成的 Iterator 对象
# 5.使用 return 方法
return 方法返回给定值,并结束遍历 Generator 函数;return 方法传入参数时,返回该参数,没有传入参数时,返回 undefined
function* gen() {
yield 1;
}
let g = gen();
console.log(g.return('gen')); // {value: "gen", done: true}
1
2
3
4
5
6
2
3
4
5
6